package com.zues.thread.single_instance;

import com.zues.thread.util.ThreadUtil;

/**
 * 演示单例模式
 * 线程安全的懒汉式
 *
 * @author zues
 * @date 12/7/2024 11:04 下午
 */
public class Bank {

    private Bank(){}

    //为了避免指令重排,需要添加volatile关键字
    private static volatile Bank instance = null;

    /**
     * 线程安全的方式一 同步方法
     * @return Bank实例
     */
    public static synchronized Bank getInstance(){
        if(instance == null){
            ThreadUtil.sleep(1);
            instance = new Bank();
        }
        return instance;
    }

    /**
     * 线程安全的方式二 同步代码块
     * @return Bank实例
     */
    public static Bank getInstance2(){
        //当第一个线程创建Bank对象后，后续线程可以直接使用不用等锁，效率更高
        if(instance == null){
            synchronized (Bank.class){
                if(instance == null){
                    ThreadUtil.sleep(1);
                    instance = new Bank();
                }
            }
        }
        return instance;
    }




}
